package com.lei.mydb.backend.dm.page;


import com.lei.mydb.backend.dm.pageCache.PageCache;
import com.lei.mydb.backend.utils.RandomUtil;

import java.util.Arrays;

/**
 * @author lbwxxc
 * @date 2025/5/2 15:49
 * @description: 特殊管理第一页 ValidCheck
 * db启动时给100~107字节处填入一个随机字节，db关闭时将其拷贝到108~115字节，用于判断上一次数据库是否正常关闭
 */
public class PageOne {
    private static final int OF_VC = 100;
    private static final int LEN_VC = 8;

    public static byte[] InitRaw() {
        byte[] raw = new byte[PageCache.PAGE_SIZE];
        setVcOpen(raw);
        return raw;
    }

    public static void setVcOpen(Page pg) {
        pg.setDirty(true);
        setVcOpen(pg.getData());
    }

    private static void setVcOpen(byte[] raw) {
        System.arraycopy(RandomUtil.randomBytes(LEN_VC), 0, raw, OF_VC, LEN_VC);
    }

    public static void setVcClose(Page pg) {
        pg.setDirty(true);
        setVcClose(pg.getData());
    }

    private static void setVcClose(byte[] raw) {
        // 将"ValidCheck"设置为关闭状态
        // 通过复制raw数组中的一部分元素来实现
        // 具体来说，就是将raw数组中从OF_VC开始的LEN_VC个元素复制到raw数组中从OF_VC+LEN_VC开始的位置
        // 即 100~107 拷贝到 108~115
        System.arraycopy(raw, OF_VC, raw, OF_VC + LEN_VC, LEN_VC);;
    }

    public static boolean checkVc(Page pg) {
        return checkVc(pg.getData());
    }

    private static boolean checkVc(byte[] raw) {
        // 比较 100 ~ 107 和 108 ~ 115 字节是否相等
        return Arrays.equals(Arrays.copyOfRange(raw, OF_VC, OF_VC + LEN_VC),
                             Arrays.copyOfRange(raw, OF_VC + LEN_VC, OF_VC + 2 * LEN_VC));
    }
}
